package com.ruoyi.pos.domain.member;

import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import javax.validation.constraints.Pattern;
import java.math.BigDecimal;
import java.util.Date;

/**
 * POS会员信息实体类
 * 
 * 用于管理POS系统中的会员信息，从第三方系统获取会员数据
 * 支持会员识别、积分管理、消费统计等功能
 * 
 * @author POS System
 * @since 1.0.0
 */
@Data
@EqualsAndHashCode(callSuper = true)
public class PosMember extends BaseEntity {
    
    private static final long serialVersionUID = 1L;

    /**
     * 会员ID（主键）
     */
    private Long memberId;

    /**
     * 会员编号
     * 
     * 系统生成的唯一会员编号
     */
    @Excel(name = "会员编号")
    @NotBlank(message = "会员编号不能为空")
    @Size(max = 50, message = "会员编号长度不能超过50个字符")
    private String memberNo;

    /**
     * 会员姓名
     * 
     * 会员的真实姓名
     */
    @Excel(name = "会员姓名")
    @NotBlank(message = "会员姓名不能为空")
    @Size(max = 100, message = "会员姓名长度不能超过100个字符")
    private String memberName;

    /**
     * 手机号码
     * 
     * 会员的联系手机号，用于登录和识别
     */
    @Excel(name = "手机号码")
    @NotBlank(message = "手机号码不能为空")
    @Pattern(regexp = "^1[3-9]\\d{9}$", message = "手机号码格式不正确")
    private String phoneNumber;

    /**
     * 会员卡号
     * 
     * 会员的实体卡号或虚拟卡号
     */
    @Excel(name = "会员卡号")
    @Size(max = 50, message = "会员卡号长度不能超过50个字符")
    private String cardNumber;

    /**
     * 会员等级编码
     * 
     * 会员等级的系统编码
     */
    @Excel(name = "会员等级编码")
    @Size(max = 20, message = "会员等级编码长度不能超过20个字符")
    private String memberLevel;

    /**
     * 会员等级名称
     * 
     * 会员等级的显示名称
     */
    @Excel(name = "会员等级名称")
    @Size(max = 50, message = "会员等级名称长度不能超过50个字符")
    private String levelName;

    /**
     * 当前积分
     * 
     * 会员当前拥有的积分总数
     */
    @Excel(name = "当前积分")
    private Integer currentPoints;

    /**
     * 可用积分
     * 
     * 会员当前可使用的积分数量
     */
    @Excel(name = "可用积分")
    private Integer availablePoints;

    /**
     * 积分兑换比例
     * 
     * 1积分可兑换的现金金额
     */
    @Excel(name = "积分兑换比例")
    private BigDecimal pointsRate;

    /**
     * 会员状态
     * 
     * 0-正常
     * 1-停用
     * 2-冻结
     */
    @Excel(name = "会员状态", readConverterExp = "0=正常,1=停用,2=冻结")
    private String memberStatus;

    /**
     * 会员状态名称
     * 
     * 会员状态的显示名称
     */
    @Excel(name = "会员状态名称")
    private String statusName;

    /**
     * 注册时间
     * 
     * 会员注册的时间
     */
    @Excel(name = "注册时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
    private Date registerTime;

    /**
     * 最后消费时间
     * 
     * 会员最后一次消费的时间
     */
    @Excel(name = "最后消费时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
    private Date lastConsumeTime;

    /**
     * 累计消费金额
     * 
     * 会员历史累计消费的总金额
     */
    @Excel(name = "累计消费金额")
    private BigDecimal totalConsumeAmount;

    /**
     * 累计消费次数
     * 
     * 会员历史累计消费的次数
     */
    @Excel(name = "累计消费次数")
    private Integer totalConsumeCount;

    /**
     * 生日
     * 
     * 会员的生日日期
     */
    @Excel(name = "生日", width = 30, dateFormat = "yyyy-MM-dd")
    private Date birthday;

    /**
     * 性别
     * 
     * 0-未知
     * 1-男
     * 2-女
     */
    @Excel(name = "性别", readConverterExp = "0=未知,1=男,2=女")
    private String gender;

    /**
     * 地址
     * 
     * 会员的联系地址
     */
    @Excel(name = "地址")
    @Size(max = 500, message = "地址长度不能超过500个字符")
    private String address;

    /**
     * 备注
     * 
     * 会员的备注信息
     */
    @Excel(name = "备注")
    @Size(max = 500, message = "备注长度不能超过500个字符")
    private String remark;

    // ==================== 扩展字段（非数据库字段） ====================

    /**
     * 会员头像URL（非数据库字段）
     */
    @Excel(name = "会员头像")
    private String avatarUrl;

    /**
     * 最后同步时间（非数据库字段）
     */
    @Excel(name = "最后同步时间")
    private String lastSyncTime;

    /**
     * 第三方会员ID（非数据库字段）
     */
    @Excel(name = "第三方会员ID")
    private String thirdPartyMemberId;

    // ==================== 业务方法 ====================

    /**
     * 判断会员是否有效
     */
    public boolean isValid() {
        return "0".equals(memberStatus);
    }

    /**
     * 判断会员是否停用
     */
    public boolean isDisabled() {
        return "1".equals(memberStatus);
    }

    /**
     * 判断会员是否冻结
     */
    public boolean isFrozen() {
        return "2".equals(memberStatus);
    }

    /**
     * 判断是否有可用积分
     */
    public boolean hasAvailablePoints() {
        return availablePoints != null && availablePoints > 0;
    }

    /**
     * 计算积分可抵扣金额
     */
    public BigDecimal calculatePointsAmount() {
        if (!hasAvailablePoints() || pointsRate == null) {
            return BigDecimal.ZERO;
        }
        return BigDecimal.valueOf(availablePoints).multiply(pointsRate);
    }

    /**
     * 判断是否为VIP会员
     */
    public boolean isVipMember() {
        return "VIP".equals(memberLevel) || "VIP".equals(levelName);
    }

    /**
     * 获取性别显示名称
     */
    public String getGenderName() {
        switch (gender) {
            case "1": return "男";
            case "2": return "女";
            default: return "未知";
        }
    }

    /**
     * 获取状态显示名称
     */
    public String getStatusName() {
        switch (memberStatus) {
            case "0": return "正常";
            case "1": return "停用";
            case "2": return "冻结";
            default: return "未知";
        }
    }

    /**
     * 设置会员状态为正常
     */
    public void setNormal() {
        this.memberStatus = "0";
    }

    /**
     * 设置会员状态为停用
     */
    public void setDisabled() {
        this.memberStatus = "1";
    }

    /**
     * 设置会员状态为冻结
     */
    public void setFrozen() {
        this.memberStatus = "2";
    }

    // ==================== 备用扩展字段 ====================
    
    /**
     * 备用字段1
     */
    private String reserved1;

    /**
     * 备用字段2
     */
    private String reserved2;

    /**
     * 备用字段3
     */
    private String reserved3;

    /**
     * 备用字段4
     */
    private String reserved4;

    /**
     * 备用字段5
     */
    private String reserved5;
}
